package com.kevis.webCommon.web.session;

import org.springframework.util.StringUtils;

import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 单例模式 HttpSessionContext 将需要的session存放起来，后续进行统一管理
 *
 * @Author kevis
 * @Date 2023/3/26 21:14
 */
public class HttpSessionContext {
    private static volatile HttpSessionContext sessionContext;

    private Map<String, HttpSession> map;

    private HttpSessionContext() {
        //ConcurrentHashMap 是一个支持高并发更新与查询的哈希表(基于HashMap)。
        this.map = new ConcurrentHashMap<>();
    }

    /**
     * 单例方法
     *
     * @return
     */
    public static HttpSessionContext getInstance() {
        //先判断一次是否是null,不是的话就不需要进入了
        if (sessionContext == null) {
            //多线程情况,在这个位置会可能同时进入，导致创建多个
            synchronized (HttpSessionContext.class) {
                //多线程情况,可能第二个进入的时候,对象已经被第一个的创建好了，后续就不需要继续创建了
                //所以还需要再判断一次
                if (sessionContext == null) {
                    sessionContext = new HttpSessionContext();
                }
            }
        }
        return sessionContext;
    }


    /**
     * 添加 session
     *
     * @param session
     */
    public void addSession(HttpSession session) {
        if (session != null) {
            map.put(session.getId(), session);
        }
    }

    /**
     * 移除 session
     *
     * @param session
     */
    public void removeSession(HttpSession session) {
        if (session != null) {
            map.remove(session.getId());
        }
    }

    /**
     * 获取 session
     *
     * @param sessionId
     * @return
     */
    public HttpSession getSession(String sessionId) {
        if (StringUtils.hasLength(sessionId)) {
            return map.get(sessionId);
        }
        return null;
    }
}
